﻿using System;
using ApplicationGenerator.BusinessModule.MetaElements;
using ApplicationGenerator.BusinessModule.Interfaces;


namespace ApplicationGenerator.Forms.WebControls
{
    /// <summary>
    /// Definicja formularza
    /// </summary>
    [Serializable]
    public class FormControlContainer
    {
        #region Fields
        /// <summary>
        /// Macierz kontrolek
        /// </summary>
        private BaseControl[,] _controlsMatrix;

        #endregion

        #region Properties

        /// <summary>
        /// Model, na którym oparty jest formularz
        /// </summary>
        public IMetaModel Source
        {
            get;
            set;
        }

        /// <summary>
        /// Liczba wierszy
        /// </summary>
        public int RowsCount
        {
            get;
            private set;
        }

        /// <summary>
        /// Liczba kolumn
        /// </summary>
        public int ColumnsCount
        {
            get;
            private set;
        }
        #endregion

        #region Constructor
        /// <summary>
        /// Konstruktor
        /// </summary>
        /// <param name="rows">Liczba wierszy</param>
        /// <param name="cols">Liczba kolumn</param>
        public FormControlContainer(int rows, int cols)
        {
            _controlsMatrix = new BaseControl[rows, cols];
            RowsCount = rows;
            ColumnsCount = cols;
        }

        #endregion

        #region Methods

        /// <summary>
        /// Pobiera kontrolkę z macierzy na podstawie współrzędnych
        /// </summary>
        /// <param name="xCord">Współrzędna X</param>
        /// <param name="yCord">Współrzędna Y</param>
        /// <returns>Kontrolka</returns>
        public BaseControl GetControl(int row, int col)
        {
            if (row >= 0 && row < RowsCount && col >= 0 && col < ColumnsCount)
            {
                return _controlsMatrix[row, col];
            }
            else
            {
                return null;
            }
        }

        /// <summary>
        /// Dodaje kontrolkę do macierzy
        /// </summary>
        /// <param name="xCord">Współrzędna X</param>
        /// <param name="yCord">Współrzędna Y</param>
        /// <param name="control">Kontrolka do dodania</param>
        public void AddControl(int row, int col, BaseControl control)
        {
            if (row >= 0 && row < RowsCount && col >= 0 && col < ColumnsCount)
            {
                _controlsMatrix[row, col] = control;
                if (_controlsMatrix[row, col] is BaseMappedControl)
                {
                    ((BaseMappedControl)_controlsMatrix[row, col]).Source = this.Source;
                }
            }
        }

        /// <summary>
        /// Usuwa kontrolkę z macierzy kontrolek
        /// </summary>
        /// <param name="xCord">Współrzędna X</param>
        /// <param name="yCord">Współrzędna Y</param>
        public void RemoveControl(int row, int col)
        {
            if (row >= 0 && row < RowsCount && col >= 0 && col < ColumnsCount)
            {
                _controlsMatrix[row, col] = null;
            }
        }

        #endregion
    }
}
